﻿#region Using directives

using System;
using System.Text;
using System.Collections.Generic;

#endregion

namespace NiSis.Entities
{	
	///<summary>
	/// An object representation of the 'Ssh_Batch_Relazioni' table. [No description found the database]	
	///</summary>
	/// <remarks>
	/// This file is generated once and will never be overwritten.
	/// </remarks>	
	[Serializable]
	[CLSCompliant(true)]
	public partial class SshBatchRelazioni : SshBatchRelazioniBase
	{		
		#region Constructors

		///<summary>
		/// Creates a new <see cref="SshBatchRelazioni"/> instance.
		///</summary>
		public SshBatchRelazioni():base(){}	
		
		#endregion


        #region properties

        public string LinerizedSshSocietaStoricoChain
        {
            get
            {
                SshSocietaStoricoChainCollection.Sort("OrderKey");
                StringBuilder sOutputBuilder = new StringBuilder();
                foreach (SshSocietaStoricoChain s  in SshSocietaStoricoChainCollection)
                    sOutputBuilder.Append(String.Format("{0},", s.RagioneSociale));
                return sOutputBuilder.ToString().TrimEnd(',');
            }
        }

        /// <summary>
        /// Riassunto dei trader precedenti
        /// </summary>
        public string LinearizedTPrec
        {
            get
            {
                StringBuilder sOutputBuilder = new StringBuilder();
                foreach (SshTraderPrecStorico tr in SshTraderPrecStoricoCollection)
                    sOutputBuilder.Append(String.Format("{0},", tr.RagioneSociale));
                return sOutputBuilder.ToString().TrimEnd(',');

            }

        }
        /// <summary>
        /// Riassunto dei trader precedenti
        /// </summary>
        public string LinearizedTPrecDelimited
        {
            get
            {
                StringBuilder sOutputBuilder = new StringBuilder();
                foreach (SshTraderPrecStorico tr in SshTraderPrecStoricoCollection)
                    sOutputBuilder.Append(String.Format("'{0}',", tr.CdTraderPrecedente));
                return sOutputBuilder.ToString().TrimEnd(',');

            }

        }
        /// <summary>
        /// ultimo shipper nella catena
        /// </summary>
        public string LastShipper
        {
            get
            {
                if (this.SshSocietaStoricoChainCollection.Count > 0)
                    return SshSocietaStoricoChainCollection[SshSocietaStoricoChainCollection.Count - 1].RagioneSociale;

                return string.Empty;
            }
        }
        public bool HasUtenze()
        {
            foreach (SshTraderPrecStorico tp in this.SshTraderPrecStoricoCollection)
            {
                if (tp.SshUtenzeGasStoricoCollection.Count > 0)
                    return true;
            }
            return false;
        }
        public bool HasUtenze(SshStatoRelazioniList shStato)
        {
            foreach (SshTraderPrecStorico tp in this.SshTraderPrecStoricoCollection)
            {

                foreach (SshUtenzeGasStorico ut in tp.SshUtenzeGasStoricoCollection)
                    if (ut.IdStato != (int)shStato)
                        return true;
            }
            return false;
        }
        public bool HasUtenze(params SshStatoRelazioniList[] args)
        {
            List<int> lst = new List<int>();
            foreach (SshStatoRelazioniList st in args)
                lst.Add((int)st);

            foreach (SshTraderPrecStorico tp in this.SshTraderPrecStoricoCollection)
            {

                foreach (SshUtenzeGasStorico ut in tp.SshUtenzeGasStoricoCollection)
                    if (!lst.Contains(ut.IdStato ?? 0))
                        return true;
            }

            return false;

        }
        /// <summary>
        /// Clona un batch, verra salvato come un nuovo elemento nel db
        /// </summary>
        /// <param name="stato">stato filtro (1 ammesso)</param>
        /// <param name="cdTraderPrec">trader precedente filtro (1 ammesso)</param>
        /// <returns></returns>
        public SshBatchRelazioni CloneAsNew(SshStatoRelazioniList? stato, string cdTraderPrec)
        {
            SshBatchRelazioni newBatch = new SshBatchRelazioni();
            newBatch.CdPool = CdPool;
            newBatch.CdStoricoMensileRete = CdStoricoMensileRete;
            newBatch.DtIns = DtIns;
            newBatch.DtUpd = DateTime.Now;
            newBatch.CdTrasportatore = CdTrasportatore;
            newBatch.DsTrasportatore = DsTrasportatore;
            // tps
            newBatch.SshTraderPrecStoricoCollection = new TList<SshTraderPrecStorico>();
            foreach (SshTraderPrecStorico tp in SshTraderPrecStoricoCollection)
            {
                SshTraderPrecStorico newTp=new SshTraderPrecStorico();
                newTp.CdTraderPrecedente = tp.CdTraderPrecedente;
                newTp.IdTipologia = tp.IdTipologia;
                newTp.MeseInizioFornitura = tp.MeseInizioFornitura;
                newTp.Piva = tp.Piva;
                newTp.RagioneSociale = tp.RagioneSociale;

                // carica le utenze
                newTp.SshUtenzeGasStoricoCollection=new TList<SshUtenzeGasStorico>();
                foreach (SshUtenzeGasStorico ut in tp.SshUtenzeGasStoricoCollection)
                {
                    
                    SshUtenzeGasStorico newUt = new SshUtenzeGasStorico();
                    newUt.CdAteco = ut.CdAteco;
                    newUt.CdCliente = ut.CdCliente;
                    newUt.CdComune = ut.CdComune;
                    newUt.CdPrelievoAeeg = ut.CdPrelievoAeeg;
                    newUt.CdPuntoFornitura = ut.CdPuntoFornitura;
                    newUt.ConsumoAnnuoStimato = ut.ConsumoAnnuoStimato;
                    newUt.DsCliente = ut.DsCliente;
                    newUt.IdStato = ut.IdStato;
                    newUt.Note = ut.Note;
                    newUt.SAreaUscita = ut.SAreaUscita;
                    
                    if ((stato==null || newUt.IdStato==(int) stato) && (! ut.IsDeleted))
                        newTp.SshUtenzeGasStoricoCollection.Add(newUt);
                }
                if (string.IsNullOrEmpty(cdTraderPrec) || newTp.CdTraderPrecedente==cdTraderPrec)
                    newBatch.SshTraderPrecStoricoCollection.Add(newTp);
            }

            foreach (SshSocietaStoricoChain s in SshSocietaStoricoChainCollection)
            {
                SshSocietaStoricoChain newsoc = new SshSocietaStoricoChain();

                newsoc.CdSocieta = s.CdSocieta;
                newsoc.DtIns = DateTime.Now;
                newsoc.FullDescription = s.FullDescription;
                newsoc.IdTipologiaSocieta = s.IdTipologiaSocieta;
                newsoc.Piva = s.Piva;
                newsoc.RagioneSociale = s.RagioneSociale;

                newBatch.SshSocietaStoricoChainCollection.Add(newsoc);
            }

            

            return newBatch;
        }
        public SshBatchRelazioni CloneAsNew(SshStatoRelazioniList? stato)
        {
            return CloneAsNew(stato, string.Empty);
        }

        public SshBatchRelazioni CloneAsNew()
        {
            return CloneAsNew(null,string.Empty);
        }

        public void MarkStateForDeletion(SshStatoRelazioniList stato)
        {
            foreach (SshTraderPrecStorico tp in SshTraderPrecStoricoCollection)
            {
                foreach (SshUtenzeGasStorico ut in tp.SshUtenzeGasStoricoCollection)
                {
                    if (ut.IdStato == (int) stato)
                        ut.MarkToDelete();
                }
            }

        }
        public void MarkOtherStatesForDeletion(SshStatoRelazioniList stato)
        {
            foreach (SshTraderPrecStorico tp in SshTraderPrecStoricoCollection)
            {
               
                foreach (SshUtenzeGasStorico ut in tp.SshUtenzeGasStoricoCollection)
                {
                    if (ut.IdStato != (int)stato)
                        ut.MarkToDelete();
                }
            }

        }
        #endregion
	}


    public enum SsshBatchRelazioniCustumColumn
    {
        /// <summary>
        /// Id_Batch : 
        /// </summary>
        [EnumTextValue("LinerizedSshSocietaStoricoChain")]
        [ColumnEnum("LinerizedSshSocietaStoricoChain", typeof(System.String), System.Data.DbType.String, false, false, true, 20)]
        LinerizedSshSocietaStoricoChain
        
    }//End enum

}
